/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package station3d;

/**
 * Časovač bez zrnitosti.
 *
 * SmoothTimer uchovává zadaný počet posledních skutečných časů a počítá z nich
 * průměrný čas. Ten je pak použit místo skutečného času pro aktualizaci herního
 * stavu. Dokud není spočten první průměrný čas, vrací se reálný čas z časovače.
 * @author Martin
 */
public class SmoothTimer {

    /** Pole s časy. */
    private final long[] frames;
    
    /** Součet časů v poli. */
    private long totalTime;

    /** Počet časů v poli. */
    private int framesCount;

    /** Ukazatel na index, do kterého se bude zapisovat. */
    private int currentFrameIndex;

    /**
     * Vytvoří hladký časovač s pamětí na zadaný počet předchozích časů.
     */
    public SmoothTimer(int framesCount) {
        frames = new long[framesCount];
        reset();
    }
    
    /** Aktualizuje časovač a vrátí průměrný čas. */
    public long getDeltaTime(long deltaTime) {
        if (framesCount < frames.length) {
            frames[currentFrameIndex] = deltaTime;
            totalTime += deltaTime;
            currentFrameIndex++;
            framesCount++;
            return deltaTime;
        }
        else {
            if (currentFrameIndex == frames.length) currentFrameIndex = 0;
            
            // vypočítat průměr
            long averageDeltaTime = totalTime / frames.length;
            
            // vyhodit minulý čas
            totalTime -= frames[currentFrameIndex];
            frames[currentFrameIndex] = deltaTime;
            totalTime += deltaTime;
            currentFrameIndex++;
            
            return averageDeltaTime;
        }
    }


    /** Resetuje časovač. */
    public void reset() {
        totalTime = 0;
        framesCount = 0;
        currentFrameIndex = 0;
    }



}
